<?php 
////////////////////////////////////////////////////////////////////////////
//                                                                        //
// NOTICE OF COPYRIGHT                                                    //
//                                                                        //
// Dean`s Office for Moodle                                               //
// Электронный деканат                                                    //
// <http://deansoffice.ru/>                                               //
//                                                                        //
// Copyright (C) 2008-2999  Alex Djachenko (Алексей Дьяченко)             //
// alex-pub@my-site.ru                                                    //
// Copyright (C) 2008-2999  Evgenij Cigancov (Евгений Цыганцов)           //
// Copyright (C) 2008-2999  Ilia Smirnov (Илья Смирнов)                   //
// Copyright (C) 2008-2999  Mariya Rojayskaya (Мария Рожайская)           //
//                                                                        //
// This program is free software: you can redistribute it and/or modify   //
// it under the terms of the GNU General Public License as published by   //
// the Free Software Foundation, either version 3 of the Licensen.        //
//                                                                        //
// This program is distributed in the hope that it will be useful,        //
// but WITHOUT ANY WARRANTY; without even the implied warranty of         //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          //
// GNU General Public License for more details.                           //
//                                                                        //
// You should have received a copy of the GNU General Public License      //
// along with this program.  If not, see <http://www.gnu.org/licenses/>.  //
//                                                                        //
////////////////////////////////////////////////////////////////////////////
// подключаем библиотеки верхнего уровня
require_once(dirname(realpath(__FILE__))."/../lib.php");

/** Класс, реилизующий функции для выгрузки данных, импортируемых в dnevnikru
 *
 */
class dof_sync_dnevnikru_export_excel
{
    // $DOF
    protected  $dof;

   /**
    * Конструктор класса
    */
    public function __construct($DOF)
    {
        $this->dof = $DOF;
    }

   /**
    * создаем подключение к реестру
    * @param string $downsubstorage - внутреннее хранилище данных
    * @param string $upsubstorage - внешнее хранилище данных
    * @return bool
    */
    private function create_sync($downsubstorage, $upsubstorage)
    {
        if ( $connect = $this->dof->storage('sync')->createConnect('sync', 'dnevnikru', $downsubstorage,
                'soap', 'dnevnikru', $upsubstorage) )
        {
            return $connect;
        }
        return false;
    }

   /**
    * добавление классов в реестр синхронизаций
    * @return bool
    */
    public function save_agroups_for_sync()
    {
        $rez = true;
        
        if ( !$connect = $this->create_sync('programmsbcs', 'classes') )
        {
            return false;
        }

        // получаем список id программ для добавления в реестр
        if ( !$programmids = explode(',', $this->dof->storage('config')->get_config_value(
                'programms_for_sync', 'sync', 'dnevnikru')) )
        {
            return false;
        }
        
        foreach ($programmids as $key => $value)
        {// преобразуем массив для sql запроса
            $programmids[$key] = " programmid = {$value} ";
        }
        
        $select = " status = 'active' AND ( ".implode(' OR ', $programmids)." );";        
        // находим активные подписки на программы
        if ( !$programmsbcs = $this->dof->storage('programmsbcs')->get_records_select($select) )
        {
            return true;
        }
        
        foreach ( $programmsbcs as $record )
        {// добавляем подписки в реестр с операцией 'connect'        
            $rez = $connect->updateUp($record->id, 'connect', null, intval($record->id . rand(1000, 9999)) ) & $rez;
        }
        return $rez;
    }

   /**
    * получение данных для экспорта классов
    * @return array|bool
    */
    public function get_agroups_for_export()
    {
        $rez = array();
        
        if ( !$connect = $this->create_sync('programmsbcs', 'classes') )
        {
            return false;
        }
        
        if ( !$records = $connect->listSync() )
        {// данных нет - вернем пустой массив
            return array();
        }
        
        foreach ($records as $value)
        {// массив id подписок
            $ids[] = " id = '{$value->downid}' ";
        }
        
        $select = implode(' OR ', $ids);
        if ( !$programmsbcs = $this->dof->storage('programmsbcs')->get_records_select($select) )
        {
            return array();
        }
        
        foreach ($programmsbcs as $value)
        {// собираем данные о классах            
            $tmp_arr = array();
            
            // id класса - id группы (груп.обучение) | id подписки (инд.обучение) 
            $classid  = $value->id;
            if ($value->edutype == 'group')
            {
                $classid = $value->agroupid;   
            }
            $tmp_arr[] = $classid;
            
            // id школы
            $tmp_arr[]  = $this->dof->storage('config')->get_config_value('dnevnikru_school_guid', 
                    'sync', 'dnevnikru');
    
            // литера
            $tmp_arr[]  = intval($value->agenum . $value->programmid);
            
            // параллель
            $tmp_arr[]  = $value->agenum;
            
            // учебный период
            $tmp_arr[]  = $this->dof->storage('config')->get_config_value('dnevnikru_eduage', 
                    'sync', 'dnevnikru');
            
            // тип отчетногого периода
            $tmp_arr[]  = $this->dof->storage('config')->get_config_value('dnevnikru_school_agetype', 
                    'sync', 'dnevnikru');
            
            // описание
            $tmp_arr[]  = '';
            
            $rez[] = $tmp_arr;
        }

        return $rez;
    }
    
   /**
    * добавление персон в реестр синхронизаций
    * @param int $depid - id подразделения
    * @return bool
    */
    public function save_persons_for_sync($depid)
    {
        $rez = true;
        
        if ( !$student_connect = $this->create_sync('persons', 'persons') 
                OR !$teacher_connect = $this->create_sync('teachers', 'persons') )
        {// нет соединения - выходим
            return false;
        }
        
        if ( is_null($depid) OR intval($depid) < 0 )
        {// нет департамента - выходим
            return false;
        }
            
        // получаем список id программ
        if ( !$programmids = explode(',', $this->dof->storage('config')->get_config_value(
                'programms_for_sync', 'sync', 'dnevnikru')) )
        {
            return false;
        }
                
        foreach ($programmids as $key => $value)
        {// преобразуем массив для sql запроса
            $programmids[$key] = " programmid = {$value} ";
        }
    
        $select = " status = 'active' AND ( ".implode(' OR ', $programmids)." ) ";
        
        // добавим выборку по департаменту
        $select .= " AND departmentid = {$depid}";
        
        // находим активные подписки на программы
        if ( !$programmsbcs = $this->dof->storage('programmsbcs')->get_records_select($select) )
        {
            return true;
        }
        
        // находим и сохраняем учеников...
        
        $studentids = array();
        foreach ($programmsbcs as $key => $value)
        {// получаем список id студентов по contractid подписок
            $studentid = $this->dof->storage('contracts')->get_field(array(
                    'id' => $value->contractid, 'status' => 'work'), 'studentid');
        
            $studentids[] = " id = '$studentid' ";
        }
        
        // формируем запрос для выборки персон
        $select = implode(' OR ', $studentids)." AND status = 'active' ";
        if ( $students = $this->dof->storage('persons')->get_records_select($select) )
        {// добавляем студентов в реестр с операцией 'connect'
            foreach ( $students as $student )
            {
                $rez = $student_connect->updateUp($student->id, 'connect', null, intval($student->id . rand(1000, 9999)) ) & $rez;
            }
        }
        
        // находим и сохраняем учителей
        
        $csselect = " status = 'active' AND departmentid = {$depid}";
        $piselect = " status = 'active' AND ( ".implode(' OR ', $programmids)." ) ";
               
        // добавим в список только предметы из указанной программой
        if ( $records = $this->dof->storage('programmitems')->get_records_select($piselect) )
        {
            $itemids = array();
            foreach ($records as $value)
            {
                $itemids[] = " programmitemid = {$value->id} ";
            }
        
            $csselect .= " AND ( ". implode('OR', $itemids). " ) ";
            
            if ( !$cstreams = $this->dof->storage('cstreams')->get_records_select($csselect) )
            {// получаем список процессов по указанным предметам
                return true;    
            }
            
            foreach ($cstreams as $value)
            {// получаем список appointmentid
                $appids[] = " appointmentid = {$value->appointmentid} ";
            }
                        
            $tchselect = " status = 'active' AND ( ". implode(" OR ", $appids). " ); ";
            
            if ( $teachers = $this->dof->storage('teachers')->get_records_select($tchselect) )
            {// добавляем учителей в реестр с операцией 'connect'
                foreach ( $teachers as $teacher )
                {
                    $rez = $teacher_connect->updateUp($teacher->id, 'connect', null, intval($teacher->id . rand(1000, 9999)) ) & $rez;
                }
            }
            return true;
            
        }
        return $rez;
    }
    
   /**
    * добавление членств в реестр синхронизаций
    * @param int $depid - id подразделения
    * @return bool
    */
    public function save_memberships_for_sync($depid)
    {
        $rez = true;
        
        if ( !$connect = $this->create_sync('programmsbcs', 'memberships') )
        {// нет подключение к реетсру - выоходим
            return false;
        }
        
        $select = " status = 'active' ";
        
        if ( is_null($depid) OR intval($depid) < 0 )
        {// нет департамента - выходим
            return false; 
        }
        
        $select .= " AND departmentid = {$depid} ";    
           
        // находим активные подписки на программы
        if ( !$programmsbcs = $this->dof->storage('programmsbcs')->get_records_select($select) )
        {
            return true;
        }
    
        foreach ( $programmsbcs as $record )
        {// добавляем подписки в реестр с операцией 'connect'
            $rez = $connect->updateUp($record->id, 'connect', null, intval($record->id . rand(1000, 9999)) ) & $rez;
        }
        return $rez;
    }
    
   /**
    * получение данных для экспорта персон
    * @param string $type - тип экспорта (students, teachers, all)
    * @return array
    */
    public function get_persons_for_export($type = null)
    {
        $rez = array();
        $persons_data = array();
        
        if ($type == 'students')
        {// создаем подключение для студентов
            if ( !$student_connect = $this->create_sync('persons', 'persons') )
            {
                return array();
            }
            
            $teacher_connect = null;
        }else if ($type == 'teachers')
        {// создаем подключение для учителей
            if ( !$teacher_connect = $this->create_sync('teachers', 'persons') )
            {
                return array();
            }
            
            $student_connect = null;
        }else
        {// создаем оба подключения
            if ( !$teacher_connect = $this->create_sync('teachers', 'persons') 
                    OR !$student_connect = $this->create_sync('persons', 'persons') )
            {
                return array();
            }
        }
        
        // данные студентов...
        
        if ( !is_null($student_connect) )
        {// есть подключение для студентов - собираеи данные
            if ( $records = $student_connect->listSync() )
            {
                foreach ($records as $value)
                {// массив id студентов
                    $ids[] = " id = '{$value->downid}' ";
                }        
                
                $select = " status <> 'archived' AND ( ".implode(' OR ', $ids)." );";
                
                if ( $students = $this->dof->storage('persons')->get_records_select($select) )
                {// записи найдены - добавим в массив для преобразования
                    $persons_data = array_merge($persons_data, $students);
                }
            }
        }
        
        // данные учителей...
        
        if ( !is_null($teacher_connect) )
        {// есть подключение для учителей - собираем данные
            if ( $records = $teacher_connect->listSync() )
            {
                foreach ($records as $value)
                {// массив id студентов
                    $ids[] = " id = {$value->downid} ";
                }
            
                $select = " status = 'active' AND ( ".implode(' OR ', $ids)." );";
                if ( $teachers = $this->dof->storage('teachers')->get_records_select($select) )
                {
                    $apids = array();
                    foreach ($teachers as $teacher)
                    {// получаем список id назначений учителей
                        $apids[] = $teacher->appointmentid;
                    }
                    
                    $eagids = array();
                    if ( $app_records = $this->dof->storage('appointments')->get_records(array(
                            'status' => 'active', 'id' => $apids)) )
                    {// список назначений данных учителей
                        foreach ($app_records as $value)
                        {// массив id договоров
                            $eagids[] = " id = {$value->eagreementid} ";
                        }

                        $select = " status = 'active' AND ( ".implode(' OR ', $eagids)." );";
                        
                        $perids = array();
                        if ( $eagreements = $this->dof->storage('eagreements')->get_records_select($select) )
                        {// список договоров по назначениям
                            foreach ( $eagreements as $value )
                            {
                                $perids[] = " id = {$value->personid} ";
                            }
                            
                            $select = " status <> 'archived' AND ( ".implode(' OR ', $perids)." );";
                            if ( $persons = $this->dof->storage('persons')->get_records_select($select) )
                            {// персоны найдены - добавим в массив для преобразования

                                $persons_data = array_merge($persons_data, $persons);
                            }
                        }
                    }
                }
            }
        }
        
        if ( empty($persons_data) )
        {// массив ничего не попало - выходим
            return array();
        }
        
        // преобразуем данные в нужный формат
        foreach ($persons_data as $value)
        {
            $tmp_arr = array();
            // id персоны
            $tmp_arr[]  = $value->id;
            // имя
            $tmp_arr[]  = $value->firstname;
            // фамилия
            $tmp_arr[]  = $value->lastname;
            // отчество
            $tmp_arr[]  = $value->middlename;
            // дата рождения
            $tmp_arr[]  = date("d/m/y", $value->dateofbirth);
            // пол
            $tmp_arr[]  = $value->gender;
            // email
            $tmp_arr[]  = $value->email;
                
            $rez[] = $tmp_arr;
        }
        
        return $rez;
    }
    
   /**
    * получение данных для экспорта членств
    * @return array|bool
    */
    public function get_memberships_for_export()
    {
        $rez = array();
        $membership_data = array();
        
        if ( !$connect = $this->create_sync('programmsbcs', 'memberships') )
        {// нет подключения - выходим
            return false;
        }
       
        if ( !$records = $connect->listSync() )
        {// данных нет - вернем пустой массив
            return array();
        }
        
        foreach ($records as $value)
        {// массив id подписок
            $ids[] = " id = '{$value->downid}' ";
        }
        
        $select = implode(' OR ', $ids);
        if ( !$programmsbcs = $this->dof->storage('programmsbcs')->get_records_select($select) )
        {
            return array();
        }
        
        foreach ($programmsbcs as $value)
        {// цикл по подпискам - добавляем в членство учеников и учителя
            
            $classid = $value->id;
            if ( $value->edutype == 'group' )
            {// находим id для данного класса
                $classid = $value->agroupid;
            }
                       
            // получаем id студентa по contractid подписок
            if ( $studentid = $this->dof->storage('contracts')->get_field(array(
                    'id' => $value->contractid, 'status' => 'work'), 'studentid') )
            {
                $tmp_obj = new stdClass();
                $tmp_obj->personid = $studentid;
                $tmp_obj->classid = $classid;
                $tmp_obj->role = 'student';
                
                $membership_data[] = $tmp_obj;
            }
        }
                
        foreach ($membership_data as $value)
        {// собираем данные для экспорта            
            $tmp_arr = array();

            // id персоны
            $tmp_arr[]  = $value->personid;
            
            // id школы
            $tmp_arr[]  = $this->dof->storage('config')->get_config_value('dnevnikru_school_guid', 
                    'sync', 'dnevnikru');

            // id класса - id подписки
            $tmp_arr[]  = $value->classid;
           
            // роль (ученик, сотрудник)
            $tmp_arr[]  = $value->role;
            
            $rez[] = $tmp_arr;
        }
        return $rez;
    }
    
   /**
    * получение заголовков для экспортного csv файла
    * @param string $format - формат данных
    * @return array | false
    * @access public
    */
    public function get_export_title($format)
    {
        switch ($format)
        {
            case "classes":
                $title_arr['classes'] = array($this->dof->get_string('export_classes_classid', 'dnevnikru'),
                    $this->dof->get_string('export_classes_schoolguid', 'dnevnikru'),
                    $this->dof->get_string('export_classes_liter', 'dnevnikru'),
                    $this->dof->get_string('export_classes_parall', 'dnevnikru'),
                    $this->dof->get_string('export_classes_age', 'dnevnikru'),
                    $this->dof->get_string('export_classes_agetype', 'dnevnikru'),
                    $this->dof->get_string('export_classes_note', 'dnevnikru') );
                return $title_arr;
    
            case "persons":
                $title_arr['persons'] = array($this->dof->get_string('export_persons_guid', 'dnevnikru'),
                    $this->dof->get_string('export_persons_firstname', 'dnevnikru'),
                    $this->dof->get_string('export_persons_lastname', 'dnevnikru'),
                    $this->dof->get_string('export_persons_middlename', 'dnevnikru'),
                    $this->dof->get_string('export_persons_dateofbirth', 'dnevnikru'),
                    $this->dof->get_string('export_persons_gender', 'dnevnikru'),
                    $this->dof->get_string('export_persons_email', 'dnevnikru') );
                return $title_arr;
    
            case "memberships":
                $title_arr['memberships'] = array($this->dof->get_string('export_membership_personid', 'dnevnikru'),
                    $this->dof->get_string('export_membership_schoolguid', 'dnevnikru'),
                    $this->dof->get_string('export_membership_classid', 'dnevnikru'),
                    $this->dof->get_string('export_membership_role', 'dnevnikru'));
                return $title_arr;
                
            case "all":
                $title_arr['classes'] = array($this->dof->get_string('export_classes_classid', 'dnevnikru'),
                    $this->dof->get_string('export_classes_schoolguid', 'dnevnikru'),
                    $this->dof->get_string('export_classes_liter', 'dnevnikru'),
                    $this->dof->get_string('export_classes_parall', 'dnevnikru'),
                    $this->dof->get_string('export_classes_age', 'dnevnikru'),
                    $this->dof->get_string('export_classes_agetype', 'dnevnikru'),
                    $this->dof->get_string('export_classes_note', 'dnevnikru') );
                
                $title_arr['persons'] = array($this->dof->get_string('export_persons_guid', 'dnevnikru'),
                    $this->dof->get_string('export_persons_firstname', 'dnevnikru'),
                    $this->dof->get_string('export_persons_lastname', 'dnevnikru'),
                    $this->dof->get_string('export_persons_middlename', 'dnevnikru'),
                    $this->dof->get_string('export_persons_dateofbirth', 'dnevnikru'),
                    $this->dof->get_string('export_persons_gender', 'dnevnikru'),
                    $this->dof->get_string('export_persons_email', 'dnevnikru') );
                
                $title_arr['memberships'] = array($this->dof->get_string('export_membership_personid', 'dnevnikru'),
                    $this->dof->get_string('export_membership_schoolguid', 'dnevnikru'),
                    $this->dof->get_string('export_membership_classid', 'dnevnikru'),
                    $this->dof->get_string('export_membership_role', 'dnevnikru'));
            
                return $title_arr;
                    
            default: return false;
        }
        return false;
    }
    
    /**
     * подключение файла экспорта данных
     * @param string $format - формат данных
     * @return string
     */
    public function include_export_script($format)
    {
        if ( !$headers = $this->get_export_title($format) )
        {// нет заголовков - выходим
            return false;
        }
        
        switch ($format)
        {
            case "classes":
                $export_data['classes'] = $this->get_agroups_for_export();
                require_once('export_excel.php');
                break;
            
            case "persons":
                $export_data['persons'] = $this->get_persons_for_export();
                require_once('export_excel.php');
                break;
                    
            case "memberships":
                $export_data['memberships'] = $this->get_memberships_for_export();
                require_once('export_excel.php');
                break;
                
            case "all":
                // экспорт всех данных в excel
                $export_data['classes'] = $this->get_agroups_for_export();
                $export_data['persons'] = $this->get_persons_for_export();
                $export_data['memberships'] = $this->get_memberships_for_export();
                require_once('export_excel.php');
                break;
                    
            default: return false;
        }
    }
}

?>